package com.guchenbo.example.tool;

public class Demo {
    public static void main(String[] args) {
        // 1、两个字面量
        String s = "abc";
        // 常量折叠，编译器优化，等同于 "abc"
        String s1 = "a" + "bc";
        // true
        System.out.println(s == s1);

        // 2、final修饰的变量
        final String ss1 = "a";
        final String ss2 = "bc";
        // ss1 和 ss2 被final引用，编译期间能确定值，认为是常量
        // 常量折叠，编译器优化，等同于 "abc"
        String s2 = ss1 + ss2;
        // true
        System.out.println(s == s2);

        final String s4 = "bc";
        String s5 = "a" + s4;
        // s4 final 常量折叠
        // true
        System.out.println(s == s5);

        // 3、两个变量
        String ss3 = "a";
        String ss4 = "bc";
        // 两个对象+操作，等同于 new StringBuffer().append(ss3).append(ss4).toString()，
        // 是一个新对象
        String s3 = ss3 + ss4;
        // false
        System.out.println(s == s3);
        // false s3.intern() 返回的是 s
        System.out.println(s3.intern() == s3);
        // true
        System.out.println(s3.intern() == s);
        // true
        System.out.println(s3.intern() == s2);
    }
}
